package ar.fiuba.fallar2.pac_man.pacman;

import java.awt.Point;
import java.util.List;

import ar.fiuba.fallar2.pac_man.AbstractCelda;
import ar.fiuba.fallar2.pac_man.IBusinessObject;
import ar.fiuba.fallar2.pac_man.AbstractPersonaje;
import ar.fiuba.fallar2.pac_man.celdaVacia.model.CeldaVacia;
import ar.fiuba.fallar2.pac_man.fantasma.model.Fantasma;
import ar.fiuba.fallar2.pac_man.utils.Mapa;

public class Pacman extends AbstractPersonaje{
private int id;
public static final int VICTIMA = 1;
public static final int VICTIMARIO = 2; 
private int vidas=3;
private int estado=VICTIMA;
private int direccionFutura;


public Pacman(Point posicionInicial, int velocidad, int direccionInicial) {
	super(posicionInicial, velocidad, direccionInicial);
	// TODO Auto-generated constructor stub
}
@Override
public void morir() {
	this.vidas--;
	
}
@Override
public void vivir() {
	// TODO Auto-generated method stub
	
}
@Override
protected Object clone() throws CloneNotSupportedException {
	// TODO Auto-generated method stub
	return super.clone();
}
@Override
public boolean equals(Object obj) {
	// TODO Auto-generated method stub
	return super.equals(obj);
}
@Override
protected void finalize() throws Throwable {
	// TODO Auto-generated method stub
	super.finalize();
}
@Override
public int hashCode() {
	// TODO Auto-generated method stub
	return super.hashCode();
}

public int getVidas() {
	return vidas;
}
public void setVidas(int vidas) {
	this.vidas = vidas;
}


@Override
public String toString() {
	// TODO Auto-generated method stub
	return super.toString();
}
@Override
public Point getUbicacion() {
	return ubicacion;
}
@Override
public void setUbicacion(Point ubicacion) {
	this.ubicacion = ubicacion;}
@Override
public Integer getId() {
	// TODO Auto-generated method stub
	return null;
}
@Override
public void setId(Integer id) {
	// TODO Auto-generated method stub
	
}

@Override
public String getIdString() {
	// TODO Auto-generated method stub
	return null;
}
@Override
public void setIdString(String id) {
	// TODO Auto-generated method stub
	
}
@Override
public Integer compare(IBusinessObject obj) {
	// TODO Auto-generated method stub
	return null;
}

public void checkDireccion() {
    Point proximoLugar = new Point(this.ubicacion);
   
    switch (direccionFutura){
    case ARRIBA:
            proximoLugar.y -= 1;
            break;
    case ABAJO:
            proximoLugar.y += 1;                    
            break;
    case DERECHA:  
            proximoLugar.x += 1;
            break;
    case IZQUIERDA:  
            proximoLugar.x -= 1;
            break;
    }

    if(this.getMapa().getCelda(proximoLugar)!= null){
            if (this.getMapa().getCelda(proximoLugar).isTransitable())
                    this.direccion = this.direccionFutura;
    }
}

public void checkFantasmaEnCelda(){
    List fantasmas = this.getMapa().getListaFantasmas();
    for(int i=0; i< fantasmas.size(); i++){  
    	{  if(((Fantasma)(fantasmas.get(i))).getUbicacion().equals(this.getUbicacion()) && (this.estado == VICTIMARIO))
                    ((Fantasma)(fantasmas.get(i))).morir();
    	   else  if(((Fantasma)(fantasmas.get(i))).getUbicacion().equals(this.getUbicacion()))
    			   this.morir();
    	}
    	}
}


public void moverDerecha(){
    this.setDireccionFutura(DERECHA);
}

public void moverIzquierda(){
    this.setDireccionFutura(IZQUIERDA);
}

public void moverAbajo(){
    this.setDireccionFutura(ABAJO);
}
public void moverArriba(){
    this.setDireccionFutura(ARRIBA);
}


public int getEstado() {
	return estado;
}
public void setEstado(int estado) {
	this.estado = estado;
}
public int getDireccionFutura() {
	return direccionFutura;
}
public void setDireccionFutura(int direccionFutura) {
	this.direccionFutura = direccionFutura;
}
public Pacman(Point posicionInicial, int velocidad, int direccionInicial,Mapa mapa) {
	super(posicionInicial, velocidad, direccionInicial);
	// TODO Auto-generated constructor stubi
	
	this.setMapa(mapa);
}
@Override
public int moverseEnDireccionActual() {
    Point proximoLugar = new Point(this.ubicacion);
    CeldaVacia cv=new CeldaVacia();  
    switch (direccion){
    case ARRIBA:
            proximoLugar.y -= 1;
            break;
    case ABAJO:
            proximoLugar.y += 1;                    
            break;
    case DERECHA:  
            proximoLugar.x += 1;
            break;
    case IZQUIERDA:  
            proximoLugar.x -= 1;
            break;
    }

    if(this.getMapa().getCelda(proximoLugar)!= null){
            if (this.getMapa().getCelda(proximoLugar).isTransitable())
            {   int res=0;
                AbstractCelda celAux=this.getMapa().getCelda(this.ubicacion);
                String className = celAux.getClass().getSimpleName();
            	if(className.contains("PuntoOrdinario")) 
            		    res=1;
                this.getMapa().setCelda(this.ubicacion, cv);
                this.ubicacion.setLocation(proximoLugar);
               return res;  
            }
    return 0;
    }

return 0;
}


}
